/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.ugc.cnel.manabi.bakenbeans;

import com.icesoft.faces.component.ext.HtmlCommandButton;
import com.icesoft.faces.component.ext.HtmlInputText;
import com.icesoft.faces.component.ext.HtmlInputTextarea;
import com.icesoft.faces.component.ext.HtmlSelectOneMenu;
import com.icesoft.faces.component.selectinputtext.SelectInputText;
import com.icesoft.faces.context.effects.JavascriptContext;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.context.FacesContext;
import javax.faces.event.AbortProcessingException;
import javax.faces.event.ActionEvent;
import javax.faces.event.ActionListener;
import javax.faces.event.ValueChangeEvent;
import javax.faces.model.SelectItem;
import org.ugc.cnel.manabi.entidades.Cliente;
import org.ugc.cnel.manabi.entidades.Inspeccion;
import org.ugc.cnel.manabi.entidades.Servicio;
import org.ugc.cnel.manabi.entidades.TipoServicio;
import org.ugc.cnel.manabi.jpa.ClienteJpaController;
import org.ugc.cnel.manabi.jpa.ServicioJpaController;
import org.ugc.cnel.manabi.jpa.TipoServicioJpaController;
import org.ugc.cnel.manabi.jpa.exceptions.IllegalOrphanException;
import org.ugc.cnel.manabi.jpa.exceptions.NonexistentEntityException;

/**
 *
 * @author Admin
 */
public class servicioBakendBean {

    private eventosBakenBean ventana;
    private navegacionBakenBean nav;
    private List<SelectItem> lista = new ArrayList<SelectItem>();
    private ClienteJpaController clijpa;
    private ServicioJpaController servjpa;
    private TipoServicioJpaController tipserjpa;
    private Cliente cliente_seleccionado;
    private String nombres;
    private boolean showform = false;
    private boolean btn_new_disable = true;
    private boolean btn_save_disable = true;
    private Servicio servicioseleccionado = null;
    private boolean edit = false;
    //Propiedades enlazadas con controles
    private HtmlInputText txt_codigo;
    private SelectInputText autocompletar;
    private HtmlInputText txt_nombre;
    private HtmlInputTextarea txt_detalle;
    private HtmlInputText txt_num_medidor;
    private HtmlSelectOneMenu cmb_tipo_servcio;
    //Otras tales como colecciones
    private List<Servicio> listaservicio = null;
    private String selecttiposervicio = null;
    private List indicadores = new ArrayList();
    private HtmlCommandButton btn_nuevo;

    public HtmlCommandButton getBtn_nuevo() {
        return btn_nuevo;
    }

    public void setBtn_nuevo(HtmlCommandButton btn_nuevo) {
        this.btn_nuevo = btn_nuevo;
    }

    /** Creates a new instance of servicioBakendBean */
    public servicioBakendBean() {
        FacesContext facesContext = FacesContext.getCurrentInstance();
        clijpa = (ClienteJpaController) facesContext.getApplication().getELResolver().getValue(facesContext.getELContext(), null, "ClienteJPA");
        servjpa = (ServicioJpaController) facesContext.getApplication().getELResolver().getValue(facesContext.getELContext(), null, "ServicioJPA");
        tipserjpa = (TipoServicioJpaController) facesContext.getApplication().getELResolver().getValue(facesContext.getELContext(), null, "tipoServicioJPA");
        //cargar Info de los Indicadores de Gestion
        this.indicadores.add(new String[]{"Rendimientos de Grupo Mes Actual", "Data"});
        this.indicadores.add(new String[]{"Aportacion por Grupo", "Data"});
        this.indicadores.add(new String[]{"Porcentaje Semanal Novedades", "Data"});
        this.indicadores.add(new String[]{"Porcentaje Correctivos en el Campo", "Data"});
        this.indicadores.add(new String[]{"Porcentaje Correctivos de Liquidador", "Data"});
        this.indicadores.add(new String[]{"Recuperacion Semanal", "Data"});

    }

    public navegacionBakenBean getNav() {
        return nav;
    }

    public void setNav(navegacionBakenBean nav) {
        this.nav = nav;
    }

    public eventosBakenBean getVentana() {
        return ventana;
    }

    public void setVentana(eventosBakenBean ventana) {
        this.ventana = ventana;
    }

    public List<SelectItem> getLista() {
        return lista;
    }

    public void setLista(List<SelectItem> lista) {
        this.lista = lista;
    }

    public Cliente getCliente_seleccionado() {
        return cliente_seleccionado;
    }

    public void setCliente_seleccionado(Cliente cliente_seleccionado) {
        //Cargar la Lista de servcios que no hayan sido borrados me gustaria un metodo mas elegante
        List<Servicio> lista_serv = new LinkedList<Servicio>();
        for (Servicio ser : cliente_seleccionado.getServicioCollection()) {
            if (!ser.isBorrado()) {
                lista_serv.add(ser);
            }
        }
        cliente_seleccionado.setServicioCollection(lista_serv);
        this.cliente_seleccionado = cliente_seleccionado;
    }

    public String getNombres() {
        return nombres;
    }

    public void setNombres(String nombres) {
        this.nombres = nombres;
    }

    public boolean isShowform() {
        return showform;
    }

    public void setShowform(boolean showform) {
        this.showform = showform;
    }

    public List<Servicio> getListaservicio() {
        return listaservicio;
    }

    public void setListaservicio(List<Servicio> listaservicio) {
        this.listaservicio = listaservicio;
    }

    public String getSelecttiposervicio() {
        return selecttiposervicio;
    }

    public void setSelecttiposervicio(String selecttiposervicio) {
        this.selecttiposervicio = selecttiposervicio;
    }

    public boolean isBtn_new_disable() {
        return btn_new_disable;
    }

    public void setBtn_new_disable(boolean btn_new_disable) {
        this.btn_new_disable = btn_new_disable;
    }

    public boolean isBtn_save_disable() {
        return btn_save_disable;
    }

    public void setBtn_save_disable(boolean btn_save_disable) {
        this.btn_save_disable = btn_save_disable;
    }

    public Servicio getServicioseleccionado() {
        return servicioseleccionado;
    }

    public void setServicioseleccionado(Servicio servicioseleccionado) {
        this.servicioseleccionado = servicioseleccionado;
    }

    public boolean isEdit() {
        return edit;
    }

    public void setEdit(boolean edit) {
        this.edit = edit;
    }

    public ServicioJpaController getServjpa() {
        return servjpa;
    }

    public void setServjpa(ServicioJpaController servjpa) {
        this.servjpa = servjpa;
    }

    public TipoServicioJpaController getTipserjpa() {
        return tipserjpa;
    }

    public void setTipserjpa(TipoServicioJpaController tipserjpa) {
        this.tipserjpa = tipserjpa;
    }

    //Getter an Setter de controles
    public HtmlInputText getTxt_codigo() {
        return txt_codigo;
    }

    public void setTxt_codigo(HtmlInputText txt_codigo) {
        this.txt_codigo = txt_codigo;
    }

    public SelectInputText getAutocompletar() {
        return autocompletar;
    }

    public void setAutocompletar(SelectInputText autocompletar) {
        this.autocompletar = autocompletar;
    }

    public HtmlInputText getTxt_nombre() {
        return txt_nombre;
    }

    public void setTxt_nombre(HtmlInputText txt_nombre) {
        this.txt_nombre = txt_nombre;
    }

    public HtmlInputTextarea getTxt_detalle() {
        return txt_detalle;
    }

    public void setTxt_detalle(HtmlInputTextarea txt_detalle) {
        this.txt_detalle = txt_detalle;
    }

    public HtmlInputText getTxt_num_medidor() {
        return txt_num_medidor;
    }

    public void setTxt_num_medidor(HtmlInputText txt_num_medidor) {
        this.txt_num_medidor = txt_num_medidor;
    }

    public HtmlSelectOneMenu getCmb_tipo_servcio() {
        return cmb_tipo_servcio;
    }

    public void setCmb_tipo_servcio(HtmlSelectOneMenu cmb_tipo_servcio) {
        this.cmb_tipo_servcio = cmb_tipo_servcio;
    }

    /**
     * Evento que se ejecuta al momento de escribir sobre el imput
     *@param evt Evento que viene desde el TAG
     */
    public void actulizar_lista(ValueChangeEvent evt) {
        //Buscar en la BD
        Object criterio = evt.getNewValue();

        //Buscar si solo la longitud minina es 3
        if (criterio.toString().length() >= 3) {
            //Limpiar los items
            getLista().removeAll(lista);
            List clie = clijpa.getEntityManager().createQuery("select c from Cliente c where c.nombre like :criterio and c.borrado=false").
                    setParameter("criterio", "%" + criterio.toString().toUpperCase() + "%").getResultList();
            if (clie.size() == 0) {
                getLista().add(new SelectItem(new Cliente(0)));
            }
            for (Object object : clie) {
                Cliente clie_obj = (Cliente) object;
                getLista().add(new SelectItem(clie_obj, clie_obj.getNombre()));
            }
            //Cargar los Input si esta seleccionado un cliente y cargar el cliente seleccionado
            if (evt.getComponent() instanceof SelectInputText) {
                SelectInputText auto = (SelectInputText) evt.getComponent();
                setAutocompletar(auto);
                //Preguntar si hay seleccionado un item y grabar el usuario actual
                if (auto.getSelectedItem() != null) {
                    Cliente cli = (Cliente) auto.getSelectedItem().getValue();

                    setCliente_seleccionado(cli);
                    //Cargar el Nombre de Usuario
                    txt_nombre.setValue(getCliente_seleccionado().getNombre());
                    //Habilitar el Btn de Nuevo
                    setBtn_new_disable(false);
                    //Habilitar los text del formulario
                    //activar_controles();
                    //Setar el foco sobre el promer text
                    //txt_codigo.requestFocus();
                    //Setear el foco sobre el boton de Nuevo
                    JavascriptContext.applicationFocus(FacesContext.getCurrentInstance(), "form_sistema:new_servicio");
                }
            }
        }
    }

    /**
     * Evento que se ejecuta al presionar el boton cancelar
     * @param evt Evento
     *
     */
    public void cancelar(ActionEvent evt) {
        limpiar_text();
        desactivar_controles();
        this.btn_new_disable = true;
        if (this.cliente_seleccionado != null) {
            this.cliente_seleccionado.getServicioCollection().clear();
        }
        getNav().setPagina_contenido("indicadores/indicadores.jspx");
    }

    /**
     * Evento que se ejeuta al presionar sobre el boton de editar de la grella de Servicios
     * @param evt Evento del Tag
     */
    public void editar(ActionEvent evt) {
        Servicio row_servicio = (Servicio) evt.getComponent().getAttributes().get("idfila");
        if (row_servicio != null) {
            activar_controles();
            //Ir al Scroll donde esta ubicado el formulario
            JavascriptContext.addJavascriptCall(FacesContext.getCurrentInstance(), "document.getElementById('form_sistema:form_servicio').scrollIntoView(true);");
            load_data_servicio(row_servicio);
            setServicioseleccionado(row_servicio);
            setEdit(true);
        }
    }

    /**
     * Evento que se ejeuta al presionar sobre el boton de borrar de la grella de Servicios
     * @param evt Evento del Tag
     */
    public void borrar(ActionEvent evt) {

        Servicio row_servcio = (Servicio) evt.getComponent().getAttributes().get("idfila");
        if (row_servcio != null) {
            setServicioseleccionado(row_servcio);
            getVentana().setPopup_header("Advertencia");
            getVentana().setPopup_conten("¿Desea Eliminar el Registro?");
            getVentana().setTipo_ventana(eventosBakenBean.ACEPTAR_CANCELAR);
            getVentana().setPopup_visible(true);
            // Agregar el ActionListener en caso que el boton aceptar sea presionado no se si esta bien pero creo que funciona
            getVentana().limpiar_listener();
            getVentana().getBtn_1().addActionListener(new ActionListener() {

                public void processAction(ActionEvent arg0) throws AbortProcessingException {
                    //Modifcar el Campo del estado borrado
                    getServicioseleccionado().setBorrado(true);
                    try {
                        //Gaurdar el Valor en la Base de Datos
                        servjpa.edit(getServicioseleccionado());
                        setCliente_seleccionado(clijpa.findCliente(getCliente_seleccionado().getId()));
                        //Ir al Scroll donde esta ubicada la tabla
                        JavascriptContext.addJavascriptCall(FacesContext.getCurrentInstance(), "document.getElementById('form_sistema:selec_clientes').scrollIntoView(true);");
                        cmb_tipo_servcio.requestFocus();
                    } catch (IllegalOrphanException ex) {
                        getVentana().setTipo_ventana(eventosBakenBean.CERRAR);
                        getVentana().setPopup_header("Error al Guardar Ilegal");
                        getVentana().setPopup_conten(ex.getMessage());
                        getVentana().setPopup_visible(true);
                        Logger.getLogger(servicioBakendBean.class.getName()).log(Level.SEVERE, null, ex);
                    } catch (NonexistentEntityException ex) {
                        getVentana().setTipo_ventana(eventosBakenBean.CERRAR);
                        getVentana().setPopup_header("Error al Guardar no existe Entidad");
                        getVentana().setPopup_conten(ex.getMessage());
                        getVentana().setPopup_visible(true);
                        Logger.getLogger(servicioBakendBean.class.getName()).log(Level.SEVERE, null, ex);
                    } catch (Exception ex) {
                        getVentana().setTipo_ventana(eventosBakenBean.CERRAR);
                        getVentana().setPopup_header("Error al Guardar General");
                        getVentana().setPopup_conten(ex.getCause().getMessage());
                        getVentana().setPopup_visible(true);
                        Logger.getLogger(servicioBakendBean.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            });
        }
    }

    /**
     * Metodo que se genera al presionar el boton de nuevo
     * @param evt Evento Action Listener del Tag
     */
    public void nuevo(ActionEvent evt) {
        activar_controles();
        setEdit(false);
        limpiar_text();
        txt_codigo.requestFocus();
        //Ir al Scroll donde esta ubicado el formulario 
        JavascriptContext.addJavascriptCall(FacesContext.getCurrentInstance(), "document.getElementById('form_sistema:form_servicio').scrollIntoView(true);");

    }

    /**
     * Metodo que se ejecuta al presionar el Boton Guardar
     * @param evt
     */
    public void guardar(ActionEvent evt) {
        try {
            Servicio servicio = new Servicio(isEdit() ? getServicioseleccionado().getId() : new Integer(0),
                    Integer.parseInt(txt_codigo.getValue().toString()),
                    Integer.parseInt(txt_num_medidor.getValue().toString()));
            servicio.setInspeccionCollection(new ArrayList<Inspeccion>());
            servicio.setIdCliente(getCliente_seleccionado());
            TipoServicio tipo_new_value = tipserjpa.findTipoServicio(new Integer(getSelecttiposervicio()));
            servicio.setIdTipoServicio(tipo_new_value);
            servicio.setDetalleServicio(txt_detalle.getValue().toString().toUpperCase());
            if (isEdit()) {
                //Editar Servicio
                servjpa.edit(servicio);
            } else {
                //Nuevo Servicio
                servjpa.create(servicio);
            }
            ventana.setTipo_ventana(eventosBakenBean.CERRAR);
            ventana.setPopup_header("Informacion");
            ventana.setPopup_conten("Servicio " + (isEdit() ? "Editado" : "Guardado") + " con exito");
            ventana.setPopup_visible(true);
            desactivar_controles();
            limpiar_text();
            //Refescar los servicios del cliente
            setCliente_seleccionado(clijpa.findCliente(getCliente_seleccionado().getId()));
            setEdit(false);
            //Ir al Scroll donde esta ubicada la tabla
            JavascriptContext.addJavascriptCall(FacesContext.getCurrentInstance(), "document.getElementById('form_sistema:new_servicio').scrollIntoView(true);");
        } catch (NonexistentEntityException ex) {
            ventana.setTipo_ventana(eventosBakenBean.CERRAR);
            ventana.setPopup_header("Error");
            ventana.setPopup_conten(ex.getMessage());
            ventana.setPopup_visible(true);
            Logger.getLogger(servicioBakendBean.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            Logger.getLogger(servicioBakendBean.class.getName()).log(Level.SEVERE, null, ex);
            ventana.setTipo_ventana(eventosBakenBean.CERRAR);
            ventana.setPopup_header("Error");
            ventana.setPopup_conten(ex.getMessage());
            ventana.setPopup_visible(true);
        }
    }

    /**
     * Metodo que realiza el cambio de activo a inactivo de los text del formulario
     *
     */
    private void activar_controles() {
        //autocompletar.setDisabled(!autocompletar.isDisabled());
        txt_codigo.setDisabled(false);
        txt_detalle.setDisabled(false);
        txt_num_medidor.setDisabled(false);
        cmb_tipo_servcio.setDisabled(false);
        setBtn_save_disable(false);
    }

    private void desactivar_controles() {
        txt_codigo.setDisabled(true);
        txt_detalle.setDisabled(true);
        txt_num_medidor.setDisabled(true);
        cmb_tipo_servcio.setDisabled(true);
        setBtn_save_disable(true);
    }

    private void limpiar_text() {
        txt_codigo.setSubmittedValue("");
        txt_detalle.setSubmittedValue("");
        txt_num_medidor.setSubmittedValue("");
        txt_nombre.setSubmittedValue("");
        cmb_tipo_servcio.setSubmittedValue("1");
    }

    private void limpiar_form() {

        setBtn_new_disable(true);
        txt_codigo.setSubmittedValue("");
        txt_detalle.setSubmittedValue("");
        txt_num_medidor.setSubmittedValue("");
        txt_nombre.setSubmittedValue("");
        setCliente_seleccionado(null);
        setBtn_save_disable(true);
    }

    private void load_data_servicio(Servicio row_servicio) {
        txt_codigo.setSubmittedValue(String.valueOf(row_servicio.getCodigoServicio()));
        txt_detalle.setSubmittedValue(row_servicio.getDetalleServicio());
        txt_num_medidor.setSubmittedValue(String.valueOf(row_servicio.getNMedidor()));
        txt_nombre.setSubmittedValue(row_servicio.getIdCliente().getNombre());
        cmb_tipo_servcio.setSubmittedValue(row_servicio.getIdTipoServicio().getId().toString());
        txt_codigo.requestFocus();
    }

    public List getIndicadores() {
        return indicadores;
    }

    public void setIndicadores(List indicadores) {
        this.indicadores = indicadores;
    }
}
